package com.atguigu.bigdata.scala.chapter07

import scala.io.{BufferedSource, Source}

object Scala13_Collection_Req {

    def main(args: Array[String]): Unit = {

        // TODO - 不同省份的商品点击排行
        // 需求 ： 商品（word） - 点击(count)
        // 排行 : 商品（word） - 点击(count) => 排序
        // 统计 : 省份-商品（word）- 点击(count) => 排序
        // 点击排行其实以省份为单位

        // 原始数据中的每一行数据，表示某一个省份的每一个用户点击了某一个商品一次
        val list = List(
            ("zhangsan", "河北", "鞋"),
            ("lisi", "河北", "衣服"),
            ("wangwu", "河北", "鞋"),
            ("zhangsan", "河南", "鞋"),
            ("lisi", "河南", "衣服"),
            ("wangwu", "河南", "鞋"),
            ("zhangsan", "河南", "鞋"),
            ("lisi", "河北", "衣服"),
            ("wangwu", "河北", "鞋"),
            ("zhangsan", "河北", "鞋"),
            ("lisi", "河北", "衣服"),
            ("wangwu", "河北", "帽子"),
            ("zhangsan", "河南", "鞋"),
            ("lisi", "河南", "衣服"),
            ("wangwu", "河南", "帽子"),
            ("zhangsan", "河南", "鞋"),
            ("lisi", "河北", "衣服"),
            ("wangwu", "河北", "帽子"),
            ("lisi", "河北", "衣服"),
            ("wangwu", "河北", "电脑"),
            ("zhangsan", "河南", "鞋"),
            ("lisi", "河南", "衣服"),
            ("wangwu", "河南", "电脑"),
            ("zhangsan", "河南", "电脑"),
            ("lisi", "河北", "衣服"),
            ("wangwu", "河北", "帽子")
        )

        // 将原始数据进行结构的转换，便于统计
        // (用户，省份，商品) => (省份-商品，1)
        val list1 = list.map(
            t => {
                // (河北-帽子,1)
                (t._2 + "-" + t._3, 1)
            }
        )

        // 根据key对数据进行分组
        // 省份-商品 => List(t1, t2, t3)
        val groups = list1.groupBy(_._1)
        // 省份-商品 => 10
        val itemClickCnt = groups.mapValues(_.size)
        println(itemClickCnt)

        // 将省份和商品进行拆分，将省份独立出来
        // (省份-商品，cnt) =>  (省份, (商品，cnt))
        // map方法的功能主要用于数据的转换，所以集合中元素的数量应该不会改变
        val mapDatas = itemClickCnt.toList.map(
            t => {
                val key = t._1
                val cnt = t._2
                val ks = key.split("-")
                ( ks(0), (ks(1), cnt) )
            }
        )

        // 将转换结构后的数据根据省份进行分组
        // (省份, (商品，cnt))
        val groupDatas: Map[String, List[(String, (String, Int))]] = mapDatas.groupBy(_._1)

        // 将分组后的数据进行结构的转换
        val result = groupDatas.mapValues(
            list => {
                // (商品，cnt)
                val list1 = list.map(_._2)
                list1.sortBy(_._2)(Ordering.Int.reverse)
            }
        )

        println(result)

    }
}
